package com.zjw.socket.demo.starter.buffer;

import com.zjw.socket.demo.starter.annotation.IntDef;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;
import io.vertx.core.net.NetSocket;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public interface IBufferHandler {

  /**
   * 将移交下一个buffer
   */
  int BUFFER_RESULT_NEXT = 0;
  /**
   * 截断传播
   */
  int BUFFER_RESULT_INTERCEPTOR = 1;
  /**
   * 关闭此socket，并截断传播
   */
  int BUFFER_RESULT_CLOSE = 2;

  /**
   * 是否处理buffer，如果所有buffer都不处理，将关闭此连接
   *
   * @return 是否处理buffer
   */
  @BufferResult
  int onBuffer(Buffer buffer, NetSocket socket);

  /**
   * 初始化Buffer
   */
  void onStart(NetServer netServer);

  /**
   * 新client连接
   */
  void onConnect(NetSocket socket);

  /**
   * 返回此Buffer顺序,如果为负，忽略此Buffer
   */
  default int order() {
    return Integer.MAX_VALUE;
  }

  @IntDef(value = {BUFFER_RESULT_NEXT, BUFFER_RESULT_INTERCEPTOR, BUFFER_RESULT_CLOSE})
  @Retention(RetentionPolicy.SOURCE)
  @interface BufferResult {

  }
}
